import sys from PyQt4.QtCore import * from PyQt4.QtGui import * from PyQt4.QtSql import * import qrc_resources class PersonDlg(QDialog): FIRST, PREV, NEXT, LAST = range(4) def __init__(self, parent=None): super(PersonDlg, self).__init__(parent) nameLabel = QLabel("&Name:") self.nameEdit = QLineEdit() nameLabel.setBuddy(self.nameEdit) ageLabel = QLabel("&Age:") self.ageEdit = QLineEdit() ageLabel.setBuddy(self.ageEdit) adressLabel = QLabel("&adress:") self.adressEdit = QLineEdit() adressLabel.setBuddy(self.adressEdit) firstButton = QPushButton() firstButton.setIcon(QIcon(":/first.png")) prevButton = QPushButton() prevButton.setIcon(QIcon(":/prev.png")) nextButton = QPushButton() nextButton.setIcon(QIcon(":/next.png")) lastButton = QPushButton() lastButton.setIcon(QIcon(":/last.png")) addButton = QPushButton("&Add") addButton.setIcon(QIcon(":/add.png")) deleteButton = QPushButton("&Delete") deleteButton.setIcon(QIcon(":/delete.png")) quitButton = QPushButton("&Quit") quitButton.setIcon(QIcon(":/quit.png")) fieldLayout = QGridLayout() fieldLayout.addWidget(nameLabel, 0, 0) fieldLayout.addWidget(self.nameEdit, 0, 1, 1, 3) fieldLayout.addWidget(ageLabel, 1, 0) fieldLayout.addWidget(self.ageEdit, 1, 1, 1, 3) fieldLayout.addWidget(adressLabel, 2, 0) fieldLayout.addWidget(self.adressEdit, 2, 1, 1, 3) navigationLayout = QHBoxLayout() navigationLayout.addWidget(firstButton) navigationLayout.addWidget(prevButton) navigationLayout.addWidget(nextButton) navigationLayout.addWidget(lastButton) fieldLayout.addLayout(navigationLayout, 3, 0, 1, 2) buttonLayout = QVBoxLayout() buttonLayout.addWidget(addButton) buttonLayout.addWidget(deleteButton) buttonLayout.addStretch() buttonLayout.addWidget(quitButton) layout = QHBoxLayout() layout.addLayout(fieldLayout) layout.addLayout(buttonLayout) self.setLayout(layout) self.model = QSqlTableModel(self) self.model.setTable("person") self.model.setSort(0, Qt.AscendingOrder) self.model.select() self.mapper = QDataWidgetMapper(self) self.mapper.setSubmitPolicy(QDataWidgetMapper.ManualSubmit) self.mapper.setModel(self.model) self.mapper.addMapping(self.nameEdit, 0) self.mapper.addMapping(self.ageEdit, 1) self.mapper.addMapping(self.adressEdit, 2) self.mapper.toFirst() self.connect(firstButton, SIGNAL("clicked()"), lambda: self.saveRecord(PersonDlg.FIRST)) self.connect(prevButton, SIGNAL("clicked()"), lambda: self.saveRecord(PersonDlg.PREV)) self.connect(nextButton, SIGNAL("clicked()"), lambda: self.saveRecord(PersonDlg.NEXT)) self.connect(lastButton, SIGNAL("clicked()"), lambda: self.saveRecord(PersonDlg.LAST)) self.connect(addButton, SIGNAL("clicked()"), self.addRecord) self.connect(deleteButton, SIGNAL("clicked()"), self.deleteRecord) self.connect(quitButton, SIGNAL("clicked()"), self.accept) self.setWindowTitle("Person") def reject(self): self.accept() def accept(self): self.mapper.submit() QDialog.accept(self) def saveRecord(self, where): row = self.mapper.currentIndex() self.mapper.submit() if where == PersonDlg.FIRST: row = 0 elif where == PersonDlg.PREV: row = 0 if row <= 1 else row - 1 elif where == PersonDlg.NEXT: row += 1 if row >= self.model.rowCount(): row = self.model.rowCount() - 1 elif where == PersonDlg.LAST: row = self.model.rowCount() - 1 self.mapper.setCurrentIndex(row) def addRecord(self): row = self.model.rowCount() self.mapper.submit() self.model.insertRow(row) self.mapper.setCurrentIndex(row) self.nameEdit.setFocus() def deleteRecord(self): name = self.nameEdit.text() if QMessageBox.question(self, QString("Delete"), QString("Delete %1 ?").arg(name), QMessageBox.Yes|QMessageBox.No) == QMessageBox.No: return row = self.mapper.currentIndex() self.model.removeRow(row) self.model.submitAll() if row + 1 >= self.model.rowCount(): row = self.model.rowCount() - 1 self.mapper.setCurrentIndex(row) def main(): app = QApplication(sys.argv) db = QSqlDatabase.addDatabase("QMYSQL") db.setDatabaseName('test') db.setUserName('root') if not db.open(): QMessageBox.warning(None, "Person", QString("Database Error: %1").arg(db.lastError().text())) sys.exit(1) form = PersonDlg() form.show() sys.exit(app.exec_()) main()